package com.quanyan.user.repository;

import com.quanyan.common.constants.Constants;
import com.quanyan.user.mapper.ETbLevelMapper;
import com.quanyan.user.mapper.TbLevelMapper;
import com.quanyan.user.mapper.TbLevelParamMapper;
import com.quanyan.user.model.db.TbLevel;
import com.quanyan.user.model.db.TbLevelExample;
import com.quanyan.user.model.db.TbLevelParam;
import com.quanyan.user.model.db.TbLevelParamExample;
import com.quanyan.user.model.vo.request.ReqUserLevel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;

/**
 * Created by wmb on 2016/7/12.
 */
@Repository
public class UserLevelRepository {
    private static final Logger logger = LoggerFactory.getLogger(UserLevelRepository.class);
    @Autowired
    private TbLevelMapper tbLevelMapper;
    @Autowired
    private TbLevelParamMapper tbLevelParamMapper;
    @Autowired
    private ETbLevelMapper eTbLevelMapper;
    public TbLevel initAccount(Integer uid, Byte type) {
        TbLevelExample tbLevelExample=new TbLevelExample();
        tbLevelExample.createCriteria().andCommonIdEqualTo(uid).andTypeEqualTo(type);
        List<TbLevel> tbLevelList=tbLevelMapper.selectByExample(tbLevelExample);
        if(tbLevelList.isEmpty()){
            List<TbLevelParam> tbLevelParamList=this.getLevelParamList(1,1);
            TbLevel tbLevel=new TbLevel();
            tbLevel.setCommonId(uid);
            tbLevel.setType(type);
            //初始等级为0
            tbLevel.setLevel(0);
            tbLevel.setXp(0);
            tbLevel.setIsDelete((byte)0);
            if(tbLevelParamList.isEmpty()){
                tbLevel.setNextLevelXp(0);
            }else{
                tbLevel.setNextLevelXp(tbLevelParamList.get(0).getXp());
            }
            try{
                tbLevelMapper.insertSelective(tbLevel);
                return tbLevel;
            }catch (Exception e){
                logger.error("插入积分记录出错，错误用户：【{}】，错误信息：【{}】，错误时间：【{}】",uid,e.getMessage(),new Date());
            }
        } else {
            return tbLevelList.get(0);
        }
        return null;
    }

    public void modifyExperience(ReqUserLevel reqUserLevel) {
        eTbLevelMapper.modifyUserExperience(reqUserLevel);
    }

    public TbLevel selectByUid(Integer uid) {
        TbLevelExample tbLevelExample=new TbLevelExample();
        tbLevelExample.createCriteria().andCommonIdEqualTo(uid).andTypeEqualTo((byte)1);
        List<TbLevel> tbLevelList=tbLevelMapper.selectByExample(tbLevelExample);
        if(tbLevelList.isEmpty()){
            return null;
        }else{
            return tbLevelList.get(0);
        }

    }

    public void updateLevel(TbLevel tbLevel) {
        try {
            eTbLevelMapper.updateLevel(tbLevel);
        } catch (Exception e) {
            logger.error("更新积分出错,错误用户：【{}】，错误信息：【{}】，错误时间：【{}】",tbLevel.getCommonId(),e.getMessage(),new Date());
        }
    }

    /**
     * 更新用户经验和等级
     * @param tbLevel
     * @return
     */
    public int updateUserLevel (TbLevel tbLevel){
        int n = eTbLevelMapper.updateUserLevel(tbLevel);
        return n;
    }

    /**
     * 获取等级参数信息
     * @param type
     * @param level
     * @return
     */
    public List<TbLevelParam> getLevelParamList(Integer type,Integer level){
        TbLevelParamExample example = new TbLevelParamExample();
        example.createCriteria().andIsDeleteEqualTo(Constants.IS_DELETE_FALSE).andTypeEqualTo(type.byteValue()).andLevelEqualTo(level);
        List<TbLevelParam> levelParamList = this.tbLevelParamMapper.selectByExample(example);
        return levelParamList;
    }
}
